#include "mainwindow.h"
#include <QDateTime>
#include <QKeyEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , loginDialog(nullptr)
    , networkManager(nullptr)
{
    setupUI();
}

MainWindow::~MainWindow()
{
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    // 检查是否按下了ESC键并且当前处于全屏状态
    if (event->key() == Qt::Key_Escape && isFullScreen()) {
        // 退出全屏模式
        showNormal();
        // 更新底部状态栏的全屏复选框状态
        if (bottomStatusWidget) {
            bottomStatusWidget->updateStatusIcons(
                bottomStatusWidget->isMuted(), 
                false,  // 设置全屏状态为false
                bottomStatusWidget->hasAlarm()
            );
        }
        updateStatusBar("全屏状态: 关闭");
    } else {
        // 调用父类的键盘事件处理函数处理其他按键
        QMainWindow::keyPressEvent(event);
    }
}

void MainWindow::setupUI()
{
    // 设置窗口基本属性
    setWindowTitle("智能家居监控系统");
    resize(1200, 800);

    // 创建中央部件和主布局
    QWidget *centralWidget = new QWidget(this);
    setCentralWidget(centralWidget);
    
    QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
    mainLayout->setContentsMargins(0, 0, 0, 0);
    mainLayout->setSpacing(0);
    
    // 创建各个界面组件
    topMenuBar = new TopMenuBar(this);
    infoPanel = new InfoPanel(this);
    videoDisplayWidget = new VideoDisplayWidget(this);
    controlPanel = new ControlPanel(this);
    devicePanel = new DevicePanel(this);
    bottomStatusWidget = new BottomStatusWidget(this);

    playbackwidget = new PlaybackWidget(this);
    playbackwidget->hide();

    // 初始化网络管理器、登录对话框和日志管理器
    networkManager = new NetworkManager(this);
    loginDialog = new LoginDialog(this);
    // 使用全局单例日志管理器
    logManager = LogManager::instance();
    // 设置日志路径
    logManager->setLogPath("log");
    
    // 添加顶部菜单栏
    mainLayout->addWidget(topMenuBar);

    mainLayout->addWidget(playbackwidget , QSizePolicy::Expanding);
    
    // 创建中间区域的水平布局
    QHBoxLayout *middleLayout = new QHBoxLayout();
    middleLayout->setContentsMargins(0, 0, 0, 0);
    middleLayout->setSpacing(0);
    
    // 添加左侧信息面板
    middleLayout->addWidget(infoPanel, 2);  // 设置宽度比例为2
    
    // 添加中央视频区域
    middleLayout->addWidget(videoDisplayWidget, 6);  // 设置宽度比例为6
    
    // 创建右侧垂直布局
    QVBoxLayout *rightLayout = new QVBoxLayout();
    rightLayout->setContentsMargins(0, 0, 0, 0);
    rightLayout->setSpacing(0);
    
    // 添加右侧设备面板
    rightLayout->addWidget(controlPanel, 1);  // 设置高度比例为1
    
    // 添加右侧云台控制面板
    rightLayout->addWidget(devicePanel, 1);  // 设置高度比例为1
    
    // 将右侧布局添加到中间区域布局
    QWidget *rightWidget = new QWidget();
    rightWidget->setLayout(rightLayout);
    middleLayout->addWidget(rightWidget, 2);  // 设置宽度比例为2
    
    // 将中间区域布局添加到主布局
    mainLayout->addLayout(middleLayout);  // 设置高度比例为1
    
    // 添加底部状态栏
    mainLayout->addWidget(bottomStatusWidget);
    
    // 设置信号槽连接
    setupConnections();
}
void MainWindow::setupConnections()
{
    // 连接顶部菜单栏的信号
    connect(topMenuBar, &TopMenuBar::modeChanged, this, &MainWindow::onTopMenuClicked);
    connect(topMenuBar, &TopMenuBar::loginRequested, this, &MainWindow::handleTopMenuBarLoginRequest);
    connect(topMenuBar, &TopMenuBar::logoutRequested, this, &MainWindow::handleLogoutRequest);
    
    // 连接设备面板的信号
    connect(controlPanel, &ControlPanel::deviceSelected, this, &MainWindow::onDeviceSelected);
    connect(controlPanel, &ControlPanel::requestRefreshDeviceList, this, &MainWindow::refreshDeviceList);

    // 连接PTZ控制面板的信号
    connect(devicePanel, &DevicePanel::ptzCommand, this, &MainWindow::onPTZControl);
    connect(devicePanel , &DevicePanel::recordinfo , this , &MainWindow::onRecordInfo);

    // 连接底部状态栏的信号
    connect(bottomStatusWidget, &BottomStatusWidget::channelSelected, this, [this](const QString &channelId) {
        // 将QString转换为int
        bool ok;
        int channelIndex = channelId.toInt(&ok);
        if (ok) {
            switchChannel(channelIndex);
        }
    });
    connect(bottomStatusWidget, &BottomStatusWidget::muteStateChanged, this, [this](bool muted) {
        updateStatusBar(QString("静音状态: %1").arg(muted ? "开启" : "关闭"));
    });
    connect(bottomStatusWidget, &BottomStatusWidget::fullScreenStateChanged, this, [this](bool fullScreen) {
        updateStatusBar(QString("全屏状态: %1").arg(fullScreen ? "开启" : "关闭"));
        if (fullScreen) {
            // 进入全屏模式
            showFullScreen();
        } else {
            // 退出全屏模式，恢复普通窗口模式
            showNormal();
        }
    });
    
    // 连接登录对话框的信号
    connect(loginDialog, &LoginDialog::loginRequested, this, &MainWindow::handleLoginRequest);

    // 注册信号需要单独处理，因为参数不匹配
    connect(loginDialog, &LoginDialog::registerRequested, this, [this](const QString& username, const QString& password) {
        // 调用网络管理器发送注册请求
        if (networkManager) {
            if (!networkManager->isConnected()) {
                networkManager->connectToServer("192.168.105.108", 8000);
            }
            networkManager->sendRegisterRequest(username, password);
        }
    });
    
    // 连接网络管理器的信号
    connect(networkManager, &NetworkManager::loginResponse, this, &MainWindow::handleLoginResponse);
    connect(networkManager, &NetworkManager::registerResponse, this, &MainWindow::handleRegisterResponse);
    connect(networkManager, &NetworkManager::networkError, this, &MainWindow::handleNetworkError);
    connect(networkManager , &NetworkManager::deviceListReceived , this , &MainWindow::handleDeviceListReceived);

    connect(networkManager , &NetworkManager::Record_STM32_info , this , &MainWindow::onRecord_STM32_Info);


    // 连接视频窗口单击信号
    connect(videoDisplayWidget, &VideoDisplayWidget::videoWidgetClicked , this, &MainWindow::onVideoWidgetClicked);

    connect(videoDisplayWidget , &VideoDisplayWidget::transferinfo , this , &MainWindow::onRecordInfo);


}

void MainWindow::onRecord_STM32_Info(const QString& message)
{
    infoPanel->addGraphicAlarm(message);
}


void MainWindow::onRecordInfo(const QString &time, const QString &msg)
{
    infoPanel->addWindowMessage(time , msg);
}



void MainWindow::onVideoWidgetClicked(const QString &videoUrl)
{
    qDebug() << "视频窗口被单击，URL:" << videoUrl;

    devicePanel->setCameraControlUrl(videoUrl);
}

void MainWindow::onTopMenuClicked(const QString &mode)
{
    // 处理顶部菜单按钮点击事件
    // 根据mode切换不同的功能模式
    if (mode == "视频监控") {
        // 显示视频监控相关组件
        infoPanel->show();
        infoPanel->setWindowInfoVisible(true);
        infoPanel->setGraphicAlarmVisible(true);
        infoPanel->setLogVisible(false);
        videoDisplayWidget->show();
        controlPanel->show();
        devicePanel->show();
        bottomStatusWidget->show();
        playbackwidget->hide();
    } else if (mode == "视频回放") {
        // 显示视频回放相关组件（这里简化处理，实际应该显示回放界面）
        infoPanel->hide();
        videoDisplayWidget->hide();
        controlPanel->hide();
        devicePanel->hide();
        bottomStatusWidget->hide();
        playbackwidget->show();
        //todo--------  发送获取视频时间范围的请求

    } else if (mode == "电子地图") {
        // 显示电子地图相关组件（这里简化处理，实际应该显示地图界面）
        infoPanel->hide();
        videoDisplayWidget->hide();
        controlPanel->hide();
        devicePanel->hide();
        bottomStatusWidget->hide();
        playbackwidget->hide();
    } else if (mode == "日志查询") {
        // 显示日志查询相关组件（这里简化处理，实际应该显示日志界面）
        infoPanel->show();
        infoPanel->setWindowInfoVisible(false);
        infoPanel->setGraphicAlarmVisible(false);
        infoPanel->setLogVisible(true);
        videoDisplayWidget->hide();
        controlPanel->hide();
        devicePanel->hide();
        bottomStatusWidget->hide();
        playbackwidget->hide();

    } else if (mode == "系统设置") {
        // 显示系统设置相关组件（这里简化处理，实际应该显示设置界面）
        infoPanel->hide();
        videoDisplayWidget->hide();
        controlPanel->hide();
        devicePanel->hide();
        bottomStatusWidget->hide();
        playbackwidget->hide();
    }
    
    // 更新状态栏显示当前模式
    updateStatusBar(QString("当前模式: %1").arg(mode));
}

void MainWindow::onDeviceSelected(const QString &deviceInfo)
{
    qDebug() << deviceInfo ;
}

void MainWindow::onPTZControl(QString command)
{
    // 处理PTZ控制请求
    // TODO: 实现具体功能
    //在这里调用networkmanager的sendTLV向服务器发送控制指令
    networkManager->sendTLV( TASK_PTZ_CONTROL,command.size() , command.toUtf8());
}

void MainWindow::updateStatusBar(const QString &status)
{
    // 更新状态栏信息
    if (bottomStatusWidget) {
        // 检查状态信息中是否包含特定关键字来更新相应的状态图标
        bool mute = status.contains("静音状态: 开启");
        bool fullScreen = status.contains("全屏状态: 开启");
        bool alarm = status.contains("报警");
        
        // 更新状态图标
        bottomStatusWidget->updateStatusIcons(mute, fullScreen, alarm);
        
        // 使用qDebug输出状态信息作为辅助
        qDebug() << "状态栏更新:" << status;
    }
}

void MainWindow::switchChannel(int channelIndex)
{
    videoDisplayWidget->setChannelCount(channelIndex);
}

void MainWindow::refreshDeviceList()
{
    // 刷新设备列表
    // TODO: 实现具体功能
}

void MainWindow::handleLoginRequest(const QString& username, const QString& password)
{
    LOG_INFO("账号请求登录");
    
    // 处理登录请求
    // 调用网络管理器发送登录请求
    if (networkManager) {
        if (!networkManager->isConnected()) {
            networkManager->connectToServer("192.168.105.108", 8000);
        }
        networkManager->sendLoginRequest(username, password);
    }
}

void MainWindow::handleLogoutRequest()
{
    // 处理注销请求
    LOG_INFO("账号请求注销");
    
    // 设置登录状态为未登录
    setLoginStatus(false);
    
    // 更新状态栏
    updateStatusBar("已注销");
    
    // 可以在这里添加其他注销时需要处理的逻辑
    // 例如：断开网络连接、清空设备列表等
}

void MainWindow::handleLoginResponse(bool success, const QString& message)
{
    // 处理登录响应
    qDebug() << "Handle login response, success:" << success << "message:" << message;
    if (success) {
        // 登录成功
        qDebug() << "Login successful, setting login status to true";
        LOG_INFO("用户登录成功");
        setLoginStatus(true);
        // 关闭登录对话框
        if (loginDialog) {
            qDebug() << "Closing login dialog";
            loginDialog->accept();
        }
        // 更新状态栏
        updateStatusBar("登录成功");
        qDebug() << "Login response handling completed successfully";
    } else {
        // 登录失败
        qDebug() << "Login failed, setting login status to false";
        LOG_ERROR("用户登录失败");
        setLoginStatus(false);
        // 显示错误信息
        if (loginDialog) {
            qDebug() << "Showing error message in login dialog";
            loginDialog->showError(message);
        }
        // 更新状态栏
        updateStatusBar("登录失败: " + message);
        qDebug() << "Login response handling completed with failure";
    }
}

void MainWindow::handleRegisterResponse(bool success, const QString& message)
{
    // 处理注册响应
    // TODO: 实现具体功能
    (void)success;  // 避免未使用参数警告
    (void)message;  // 避免未使用参数警告
    
    if (success) {
        // 注册成功
        updateStatusBar("注册成功");
        // 可以在这里添加注册成功后的处理逻辑
        // 例如：自动登录、提示用户等
    } else {
        // 注册失败
        updateStatusBar("注册失败: " + message);
        // 显示错误信息给用户
        if (loginDialog) {
            loginDialog->showError(message);
        }
    }
}

void MainWindow::setLoginStatus(bool loggedIn)
{
    // 设置登录状态
    if (loggedIn) {
        // 登录成功，更新界面状态
        // 可以在这里添加其他登录成功时的UI更新逻辑
        // TODO: 实现具体功能
    } else {
        // 登录失败或注销，更新界面状态
        // 可以在这里添加其他登录失败时的UI更新逻辑
        // TODO: 实现具体功能
    }
}

void MainWindow::handleNetworkError(const QString& error)
{
    LOG_ERROR("网络错误");

    // 更新状态栏显示错误信息
    updateStatusBar("网络错误: " + error);
    
    // 可以在这里添加其他网络错误处理逻辑
    // 例如：显示错误对话框、记录日志等
}

void MainWindow::handleTopMenuBarLoginRequest()
{
    // 处理顶部菜单栏登录请求
    // 显示登录对话框
    if (loginDialog) {
        loginDialog->exec();
    }
}

void MainWindow::handleDeviceListReceived(const QString& deviceListData)
{
    if(controlPanel && !deviceListData.isEmpty()){
        controlPanel->setDeviceList(deviceListData);
        LOG_INFO(QString("接收到设备列表，设备数量: %1").arg(deviceListData.split(",").size()));
    } else {
        LOG_WARNING("设备列表为空");
    }
}
